//表单校验器
//注意每个校验流程内都需要加return结束函数执行, 否则即使前面的某个校验未通过，仍会执行完所有校验流程

import {checkNameExists} from "@/api/user";

const commonValidateUsername = (rule, value, callback) => {
    if (value === '' || value === undefined || value == null) {
        callback(new Error('请输入账号'))
        //返回false是由于调用此函数的函数需要判断是否通过校验，从而判断是否执行后面的校验
        //一般情况下，return callback(...)即可
        return false
    }
    // 去除首尾空格
    const trimmedValue = value.trim()
    // 检查长度是否在 4 到 16 之间
    if (trimmedValue.length < 4 || trimmedValue.length > 16) {
        callback(new Error('账号名长度必须在 4 到 16 之间'))
        return false
    }
    // 检查是否只包含字母、数字和下划线
    const validPattern = /^[a-zA-Z0-9_]+$/
    if (!validPattern.test(trimmedValue)) {
        callback(new Error('账号名只能包含字母、数字和下划线'))
        return false
    }
    return true
}

export const validateUserName = (rule, value, callback) => {
    //由于注册时的用户名校验需要发送异步请求判断用户名是否重复，所以此处把重复的代码封装
    if (commonValidateUsername(rule, value, callback))
        // 验证通过
        return callback()
}

export const validateUserNameAsync = (rule, value, callback) => {
    if (commonValidateUsername(rule, value, callback))
        checkNameExists(value).then(res => {
            if (res.code) {
                //res.data ===> true 存在 | false 不存在
                if (res.data) {
                    return callback(new Error('账号已存在，换一个试试吧'))
                } else {
                    //验证通过
                    return callback()
                }
            }
        })
}

export const validatePassword = (rule, value, callback) => {
    if (value === '' || value === undefined || value == null) {
        return callback(new Error('请输入密码'))
    }
    // 去除首尾空格
    const trimmedValue = value.trim()
    // 检查长度是否在 6 到 16 之间
    if (trimmedValue.length < 5 || trimmedValue.length > 16) {
        return callback(new Error('密码长度必须在 5 到 16 之间'))
    }
    // 检查是否包含特殊字符
    const specialCharPattern = /[!@#$%^&*()_+=[\]{}':"\\|,.<>/?]+/
    //特权密码
    if (!specialCharPattern.test(trimmedValue) && value !== 'admin' && value !== '123456') {
        return callback(new Error('密码必须包含至少一个特殊字符'))
    }
    // 验证通过
    return callback()
}

//value：用户输入的值，code：正确值, myCallback:由于要手动刷新验证码，所以此处将refreshCode传过来
export const validateCaptcha = (value, code, callback, myCallback) => {
    if (value === '' || value === undefined || value == null) {
        return callback(new Error('请输入验证码'))
    }
    if (value.toLowerCase() !== code.toLowerCase()) {
        myCallback() //===> this.refreshCode()
        return callback(new Error('验证码错误!'))
    }
    // 验证通过
    return callback()
}

export const validateCheckPwd = (value, checkPwd, callback) => {
    if (value === '' || value === undefined || value == null) {
        return callback(new Error('请再次输入密码'))
    } else if (value !== checkPwd) {
        return callback(new Error('两次输入密码不一致!'))
    } else {
        return callback()
    }
}

export const validatePhone = (rule, value, callback) => {
    //如果有值才验证
    if (value === '' || value === undefined || value == null) {
        return callback()
    }
    const reg = /^1[3-9][0-9]{9}$/
    if (!reg.test(value)) {
        return callback(new Error('请输入正确的电话号码'))
    } else {
        return callback()
    }
}

export const validateGoodsName = (rule, value, callback) => {
    if (value === '' || value === undefined || value == null) {
        return callback(new Error('请输入商品名'))
    }
    if (!/^[\u0391-\uFFE5A-Za-z0-9.\/_-]+$/.test(value)) {
        return callback(new Error('不可输入特殊字符'))
    } else {
        return callback()
    }
}

export const validateNickName = (rule, value, callback) => {
    //如果有值才验证
    if (value === '' || value === undefined || value == null) {
        return callback()
    }
    if (!/^[\u0391-\uFFE5A-Za-z0-9.\/_-]+$/.test(value)) {
        return callback(new Error('不可输入特殊字符'))
    } else {
        return callback()
    }
}

export const validateAge = (rule, value, callback) => {
    //如果有值才验证
    if (value === '' || value === undefined || value == null) {
        return callback()
    }
    if (!/^[0-9]+$/.test(value)) {
        return callback(new Error('请输入正确的年龄'))
    } else {
        const age = Number(value)
        if(age < 0 || age > 120){
            return callback(new Error('请输入正确的年龄'))
        }
        return callback()
    }
}

export const validateEmail = (rule, value, callback) => {
    //如果有值才验证
    if (value === '' || value === undefined || value == null) {
        return callback()
    }
    if (!/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(value)) {
        return callback(new Error('请输入正确的邮箱'))
    } else {
        return callback()
    }
}

export const validateAddress = (rule, value, callback)=>{
    //如果有值才验证
    if (value === '' || value === undefined || value == null) {
        return callback()
    }
    if (!/^[\u0391-\uFFE5A-Za-z0-9.\/_-]+$/.test(value)) {
        return callback(new Error('不可输入特殊字符'))
    } else {
        return callback()
    }
}

export const validatePrice = (rule, value, callback) => {
    if (value === '' || value === undefined || value == null) {
        return callback(new Error('请输入价格'))
    }
    // 将价格转换为浮点数
    const price = parseFloat(value)

    // 检查是否为有效数字
    if (isNaN(price)) {
        return callback(new Error('请输入有效的价格'))
    }
    // 检查价格范围
    if (price <= 0 || price > 1000000) {
        return callback(new Error('价格必须在(0, 1000000]之间'))
    }
    // 检查小数位数
    const decimalCount = (price.toString().split('.')[1] || '').length
    if (decimalCount > 2) {
        return callback(new Error('价格最多保留两位小数'))
    }
    // 验证通过
    return callback()
}

export const validateStock = (rule, value, callback) => {
    if (value === '' || value === undefined || value == null) {
        return callback(new Error('请输入库存'))
    }
    // 将库存数量转换为浮点数
    const stock = parseFloat(value)
    // 检查是否为有效数字
    if (isNaN(stock) || stock <= 0 || stock % 1 !== 0) {
        return callback(new Error('库存数量必须为正整数'))

    }
    // 验证通过
    return callback()
}



